package com.pointtown.vcrss.common;

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;

import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;

import android.util.Log;
import android.util.Xml;

import com.pointtown.vcrss.database.Entry;

public class XmlManager {
	
	private static String TAG = "XmlManager";
	private static SimpleDateFormat df = new SimpleDateFormat("ddMMyyyyHHmmss");
	
	public static HashMap<String, Object> parseXml(InputStream is) {
		
		HashMap<String, Object> hashMap = new HashMap<String, Object>();
		ArrayList<Entry> entryList = new ArrayList<Entry>();
		String last_build_date = "";
		try {
			// 解析対象のストリームを取得する
			XmlPullParser parser = null;

			//mlPullParserを定義する
			parser = Xml.newPullParser();
			// パースする文字列のストリームを渡す
			parser.setInput(new InputStreamReader(is));

			int eventType = 0;
			String tag = null;
			// XmlPullParser パースしている階層を取得
			final int depth = parser.getDepth();
			// XmlPullParser パースの終了条件
			/* while文で一つずつ処理をする */
			while (((eventType = parser.next()) != XmlPullParser.END_DOCUMENT)
					|| (parser.getDepth() > depth)) {
				// XmlPullParser eventTypeが開始タグか判定
				if (eventType == XmlPullParser.START_TAG) {
					// XmlPullParser タグの名前を取得する
					tag = parser.getName();
					
					// XmlPullParser タグの名前が"lastBuildDate"
					if("lastBuildDate".equals(tag)){
						parser.next();
						last_build_date = parser.getText();
					}
					
					// XmlPullParser タグの名前が"item"なら、parseToRowModelを呼び出す
					if ("item".equals(tag)) {
						entryList.add(parseToRowModel(parser));
					}
                } 
			}
		} catch (Exception e) {
			Log.e(TAG, Log.getStackTraceString(e));
		} finally {
			if (is != null) {
				try {
					is.close();
				} catch (IOException e) {
					Log.e(TAG, Log.getStackTraceString(e));
				}
			}
		}
		hashMap.put("entryList", (ArrayList<Entry>)entryList);
		hashMap.put("last_build_date", last_build_date);
		return hashMap;
	}

	private static Entry parseToRowModel(XmlPullParser parser) throws XmlPullParserException, IOException {
		Entry entity = new Entry();
		int eventType;
		String tag = null;
		// パースする階層を取得する
		final int depth = parser.getDepth();
		// パースの終了条件
		while (((eventType = parser.next()) != XmlPullParser.END_DOCUMENT || parser
				.getDepth() > depth)) {
			// eventTypeが開始タグか判定
			if (eventType == XmlPullParser.START_TAG) {
				tag = parser.getName();
				// <entry>の中の<id>タグの値を取得し、RowModelに値をセットする
				if ("title".equals(tag)) {
					// 次に移動する。
					parser.next();
					// parserからテキスト情報を取得し、セットする。
					entity.setTitle(parser.getText());
					//RegistDate, UpdateDate
					String date = df.format(new Date());
					entity.setRegistDate(date);
					entity.setUpdateDate(date);
				} else if ("link".equals(tag)) {
					parser.next();
					entity.setLink(parser.getText());
				} else if ("description".equals(tag)) {
					parser.next();
					entity.setDescription(parser.getText());
				} else if ("pubDate".equals(tag)) {
					parser.next();
					entity.setPubDate(parser.getText());					
				} else if ("category".equals(tag)) {
					parser.next();
					entity.setCategory(parser.getText());
					break;
				}
			}
		}
		return entity;
	}
}
